﻿#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>


int main(void)
{
	{   //整型提升：讨论的是表达式中char和short类型的值
		/*
			表达式中的字符和短整型操作数在使⽤之前被转换为普通整型，这种转换称为整型提升
			通⽤CPU（general-purpose CPU）是难以直接实现两个8⽐特字节直接相加运算（虽然机器指令中
			可能有这种字节相加指令）。所以，表达式中各种⻓度可能⼩于int⻓度的整型值，都必须先转换为
			int或unsigned int，然后才能送⼊CPU去执⾏运算
			1. 有符号整数提升是按照变量的数据类型的符号位来提升的
			2. ⽆符号整数提升，⾼位补0
		*/
		/*[signed] char:-128~127*/
		char a = 20;
		char b = 130;
		/*
			0001 0100		20	(补码)
			1000 0010		130	(补码)
			0000 0000 0000 0000 0000 0000 0001 0100		20	(有符号数整型提升)
			1111 1111 1111 1111 1111 1111 1000 0010		130	(有符号数整型提升)
			1111 1111 1111 1111 1111 1111 1001 0110     计算结果（实际）
			1001 0110									截断操作（补码）
			1111 1111 1111 1111 1111 1111 1001 0110     整型提升（%d)
			1000 0000 0000 0000 0000 0000 0110 1010     显示结果（原码）
		*/
		char c = a + b;
		printf("%d\n", c);
	}
	{	//算术转换：讨论的是类型大于等于整型的数据类型
		/*	向上转换
			long double
			double
			float
			unsigned long int
			long int
			unsigned int
			int
		*/
	}
	{
		//a* b + c * d + e * f；						路径不确定
		//c + --c;+									操作符的左操作数的获取在右操作数之前还是之后求值
		//i = i-- - --i * ( i = -3 ) * i++ + ++i;	猪队友
		//answer = fun() - fun() * fun();			函数的调⽤先后顺序⽆法通过操作符的优先级确定
		//ret = (++i) + (++i) + (++i);

	}
	int i = 1;
	int ret = (++i) + (++i) + (++i);
	printf("%d\n", ret);
	printf("%d\n", i);
	/*
		这段代码中的第⼀个 + 在执⾏的时候，第三个++是否执⾏，这个是不确定的，因为依靠操作符的优先
		级和结合性是⽆法决定第⼀个 + 和第三个前置 ++ 的先后顺序
	*/
	return 0;
}
